package br.com.utdd.cadastro.dao;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.utdd.cadastro.dto.UsuarioDTO;
import br.com.utdd.cadastro.enumeration.SexoEnumeration;
import br.com.utdd.cadastro.factory.ConnectionFactory;
import br.com.utdd.cadastro.util.DataUtil;



public class UsuarioDAO {
	
	private Connection conn;
	
	public UsuarioDAO() {
		
		try {
			conn = new ConnectionFactory().getConnection();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	PreparedStatement stmt = null;

	public void incluir(UsuarioDTO usuario) {

		String sql = "insert into usuario (nome_usuario, email_usuario, sexo_usuario, dataNascimento_usuario) values (?, ?, ?, ?)";

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, usuario.getNome());
			stmt.setString(2, usuario.getEmail());
			stmt.setString(3, usuario.getSexo());
			java.util.Date data = DataUtil.data(usuario.getDataNascimento()); 
			stmt.setDate(4, new Date(data.getTime()));
			stmt.execute();
			stmt.close();

		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}
	}

	public void alterar(UsuarioDTO usuario) {

		String sql = "UPDATE USUARIO SET nome_usuario = ?, email_usuario = ?, sexo_usuario = ?, dataNascimento_usuario = ? where id_usuario = " + usuario.getId();
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, usuario.getNome());
			stmt.setString(2, usuario.getEmail());
			stmt.setString(3, usuario.getSexo());
			java.util.Date data = DataUtil.data(usuario.getDataNascimento()); 
			stmt.setDate(4, new Date(data.getTime()));
			stmt.executeUpdate();

			stmt.close();

		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}
	}

	public void excluir(UsuarioDTO usuario) {

		String sql = "delete from USUARIO where id_usuario = ?";
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setLong(1, usuario.getId());
			stmt.executeUpdate();

			stmt.close();

		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}
	}
	
	public void excluirPorNome(UsuarioDTO usuario) {

		String sql = "delete from USUARIO where nome_usuario = ?";
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, usuario.getNome());
			stmt.executeUpdate();

			stmt.close();

		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}
	}


	public List<UsuarioDTO> listar() {
		
		List<UsuarioDTO> lista = null;
		String sql = "select * from usuario";

		try {
			stmt = conn.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();

			lista = new ArrayList<UsuarioDTO>();
			while (rs.next()) {
				UsuarioDTO usuario = new UsuarioDTO();

				usuario.setId(rs.getLong("id_usuario"));
				usuario.setNome(rs.getString("nome_usuario"));
				usuario.setEmail(rs.getString("email_usuario"));				
				
				if (SexoEnumeration.FEMININO.getCode().equals(rs.getString("sexo_usuario"))) {
					usuario.setSexo(SexoEnumeration.FEMININO.getMessage());
				}
				else {
					usuario.setSexo(SexoEnumeration.MASCULINO.getMessage());
				}
				Date data = rs.getDate("dataNascimento_usuario");
				usuario.setDataNascimento(DataUtil.parseData(data));
				lista.add(usuario);
			}

			rs.close();
			stmt.close();

		} catch (SQLException e) {
			System.out.println(e.getMessage());
		}

		return lista;
	}
	
	public UsuarioDTO obterUsuario(UsuarioDTO usuario){
		
		String sql = "select * from USUARIO where id_usuario = '" + usuario.getId() + "'";
		try {
			
			stmt = conn.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			while(rs.next()) {
				usuario.setId(rs.getLong("id_usuario"));
				usuario.setNome(rs.getString("nome_usuario"));
				usuario.setEmail(rs.getString("email_usuario"));
				usuario.setSexo(rs.getString("sexo_usuario"));
				Date data = rs.getDate("dataNascimento_usuario");
				usuario.setDataNascimento(DataUtil.parseData(data));
			}
			rs.close();
			stmt.close();
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		return usuario;
		
	}
	
	public UsuarioDTO obterUsuarioPorNome(UsuarioDTO usuario){
		
		String sql = "select * from USUARIO where nome_usuario = '" + usuario.getNome() + "'";
		try {
			
			stmt = conn.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			while(rs.next()) {
				usuario.setId(rs.getLong("id_usuario"));
				usuario.setNome(rs.getString("nome_usuario"));
				usuario.setEmail(rs.getString("email_usuario"));
				usuario.setSexo(rs.getString("sexo_usuario"));
				Date data = rs.getDate("dataNascimento_usuario");
				usuario.setDataNascimento(DataUtil.parseData(data));
			}
			rs.close();
			stmt.close();
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		return usuario;
		
	}
	

}
